import Vue from 'vue'
import Vuex from 'vuex'
import {
	getUser
} from "@/api/login.js"
import {
	getWebInfo
} from '@/api/user.js'

Vue.use(Vuex);
const store = new Vuex.Store({
	state: {
		tabBarIndex: 0,
		uerInfo: uni.getStorageSync('userObj') ? uni.getStorageSync('userObj') : {},
		h5Data: uni.getStorageSync('h5Data') ? uni.getStorageSync('h5Data') : {},
		hasLogin: uni.getStorageSync('isLogin') ? uni.getStorageSync('isLogin') : false,
		socketTask: null,
		// 确保websocket是打开状态
		is_open_socket: false,
		echartsInfo:{},
		timer:null
	},
	mutations: { //定义同步操作的方法
		LoginOut(state) {
			state.hasLogin = false;
			state.uerInfo = null;
			try {
				uni.removeStorageSync('isLogin');
				uni.removeStorageSync('newToken');
				uni.removeStorageSync('userObj');
			} catch (e) {
				// error
			}
		},
		//用户信息
		UserObjState(state, data) {
			state.uerInfo = data.userInfo;
			try {
				uni.setStorageSync('userObj', data.userInfo);
			} catch (e) {
				// error
			}
		},
		//用户登录
		userLoginFn(state, data) {
			state.hasLogin = true;
			try {
				uni.setStorageSync('isLogin', true);
			} catch (e) {
				// error
			}
			uni.switchTab({
				url: '/pages/index/home'
			});
		},
		setWebInfo(state, data) {
			state.h5Data = data;
			try {
				uni.setStorageSync('h5Data', data);
			} catch (e) {
				// error
			}
		},
		setData(state, params) {
			Object.keys(params).forEach(key => {
				// 需要替换的值
				const val = params[key];
				const arr = key.split(".");
				if (arr.length > 1) {
					let obj = state;
					while ((arr.length - 1) && (obj = obj[arr.shift()]));
					obj[arr[0]] = val;
				} else {
					state[key] = val;
				}
			})
		},
		// 进入这个页面的时候创建websocket连接【整个页面随时使用】(客户端)
		connectSocketInit(state, data) {
			let initObj = data;
			console.log(initObj,'data');
			// is_open_socket,init,cmd,coinCode,interval
			// 创建一个this.socketTask对象【发送、接收、关闭socket都由这个对象操作】
			this.state.socketTask = uni.connectSocket({
				// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
				// url: "ws://192.168.63.105:8111/deep", // 你的socket地址
				url:"ws://127.0.0.1:8111/deep",
				success(res) {
					console.log("websocket连接成功", res);
				},
			});
			console.log(this.state.socketTask,'00000')
			// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
			this.state.socketTask.onOpen((res) => {
				// const loginObj = JSON.parse(uni.getStorageSync('loginObj')) //这里是因为我需要用到用户ID来做为参数
				// console.log("WebSocket连接正常打开中...！", res);
				this.state.is_open_socket = initObj.is_open_socket;
				// 注：只有连接正常打开中 ，才能正常成功发送消息
				this.state.socketTask.send({
					data: JSON.stringify({
						"cmd":initObj.cmd,
						"timeout":"1440",
						"coinCode":initObj.coinCode,
						"interval":initObj.interval
					}),
					async success() {
						console.log("消息发送成功");
					},
				});
				// 初始化数据
				if(initObj.init){
					this.state.socketTask.send({
						data: JSON.stringify({
							"cmd":"sub",
							"coinCode":initObj.coinCode,
							"interval":"1W"
						}),
						async success() {
							console.log("消息发送成功");
						},
					});
				}
				// 注：只有连接正常打开中 ，才能正常收到消息
				this.state.socketTask.onMessage((res) => {
					// console.log("收到服务器内容：", JSON.parse(res.data));
					this.state.echartsInfo = JSON.parse(res.data)
					// console.log(result,'result')
				});
			})
			// 这里仅是事件监听【如果socket关闭了会执行】
			this.state.socketTask.onClose(() => {
				console.log("已经被关闭了")
			})
		},
		// 关闭websocket【离开这个页面的时候执行关闭】
		closeSocket(state, is_open_socket) {
			console.log(this.state)
			const _this = this
			this.state.socketTask.close({
				success(res) {
					console.log("关闭成功", res)
					_this.state.is_open_socket = is_open_socket
				},
				fail(err) {
					// console.log("关闭失败", err)
				}
			})
		},
		clearIntervalFn(state) {
			console.log(state)
			clearInterval(state.timer);
		}
	},
	actions: {
		setWebInfo(context, data) {
			getWebInfo({
				typeKey: "extraParamConfig"
			}).then(res => {
				if (res.data.success) {
					let datas = JSON.parse(res.data.obj);

					context.commit('setWebInfo', datas);
				}
			}).catch(err => {

			});
		},
		getuser(context, data) {
			getUser().then((res) => {
				if (res.status == 200) {
					if (res.data.user) {
						context.commit('UserObjState', {
							userInfo: res.data.user,
							flag: data
						});
					}
				}
			});
		},
		userLogin(ctx) {
			ctx.commit('userLoginFn');
		},
		OutLogin(ctx) {
			ctx.commit('LoginOut');
		},
		clearIntervalFn(ctx){
			ctx.commit('clearIntervalFn')
		},
	}
});
export default store
